#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <set>
#include <map> 

#define flr(x, l, r) for (int x = l; x <= r; ++x)
#define frl(x, r, l) for (int x = r; x >= l; --x)
#define fmp(x, t) for (int x = h[t]; ~x; x = ne[x])
#define LL long long
#define mt memset
#define my memcpy
#define szf sizeof
#define INF 0x3f3f3f3f
#define in(x) scanf("%d", &x)
#define out(x) printf("%d", x)
#define inll(x) scanf("%lld", &x)
#define outll(x) printf("%lld", x)
#define pn printf("\n")
#define con continue
#define bk break
#define vc vector
#define pb push_back
#define sz size
#define PII pair<int, int>
#define x first
#define y second
#define P_q priority_queue
#define ft front
#define pf push_front
#define popf pop_front
#define it insert
#define ct count

using namespace std;

const int N = 510, M = N * N / 2;

int n, k, m;
struct Edge {
    int a, b;
    double w;
    bool operator< (const Edge &W) const {
        return w < W.w;
    }
}e[M];
int p[N];
PII q[M];

double get_dist(PII a, PII b) {
    double dx = a.x - b.x, dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
}

int find(int x) {
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main() {
	in(n), in(k);
    
    flr (i, 0, n - 1) in(q[i].x), in(q[i].y);
    
    flr (i, 0, n - 1)
        flr (j, 0, i - 1)
            e[m ++ ] = {i, j, get_dist(q[i], q[j])};
    
    sort(e, e + m);
    flr (i, 0, n - 1) p[i] = i;
    
    int cnt = n;
    double res = 0;
    flr (i, 0, m - 1) {
        if (cnt <= k) bk;
        
        int a = find(e[i].a), b = find(e[i].b);
        double w = e[i].w;
        
        if (a != b) {
            p[a] = b;
            cnt -- ;
            res = w;
        }
    }
    
    printf("%.2lf\n", res);
    
    return 0;
}